package com.rabbit.mq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @version V1.0.0
 * @ClassName: {@link DirectRabbitConfig}
 * @Description: DirectRabbitConfig
 * @author: Lanzhou
 * @date: 2021/3/17 9:41
 * @Copyright:2020 All rights reserved.
 */
@Configuration
public class DirectRabbitConfig {


    @Bean
    public Queue queue() {
        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        //   return new Queue("TestDirectQueue",true,true,false);
        return new Queue("queue", false);
    }


    @Bean
    public Exchange exchange() {
        /**
         * Direct Exchange 
         * 直连型交换机，根据消息携带的路由键将消息投递给对应队列。
         * 大致流程，有一个队列绑定到一个直连交换机上，同时赋予一个路由键 routing key 。
         * 然后当一个消息携带着路由值为X，这个消息通过生产者发送给交换机时，交换机就会根据这个路由值X去寻找绑定值也是X的队列。
         * Fanout Exchange
         * 扇型交换机，这个交换机没有路由键概念，就算你绑了路由键也是无视的。 这个交换机在接收到消息后，会直接转发到绑定到它上面的所有队列。
         * Topic Exchange
         * 主题交换机，这个交换机其实跟直连交换机流程差不多，但是它的特点就是在它的路由键和绑定键之间是有规则的。
         * 简单地介绍下规则：
         * *  (星号) 用来表示一个单词 (必须出现的)
         * #  (井号) 用来表示任意数量（零个或多个）单词
         */
        return new DirectExchange("exchange", true, true);
    }

    /**
     * 绑定规则为, 队列和交换机绑定对应的路由键
     *
     * @return
     */
    @Bean
    public Binding binding() {
        return BindingBuilder.bind(queue()).to(exchange()).with("queue_exchange_01").noargs();
    }


}
